use anyhow::Context;
use axum::{
  Router, debug_handler, extract::State, response::IntoResponse, routing::get,
};
use sea_orm::{Condition, prelude::*};

use crate::{
  app::AppState,
  entity::{company, prelude::*},
  error::ApiResult,
  response::ApiResponse,
};

pub type ApiResultResponse<T> = ApiResult<ApiResponse<T>>;

pub fn create_router() -> Router<AppState> {
  Router::new().route("/user", get(query_users))
}

// #[debug_handler]
// async fn query_users(
//   State(AppState { db }): State<AppState>,
// ) -> impl IntoResponse {
//   // let users = Company::find().all(&db).await.unwrap();
//   // let users = Company::find()
//   //   .filter(company::Column::Name.eq("Teddy"))
//   //   .all(&db)
//   //   .await
//   //   .unwrap();
//   // let users = Company::find()
//   //   .filter(
//   //     Condition::all()
//   //       .add(company::Column::Age.eq(27))
//   //       .add(company::Column::Name.starts_with("D")),
//   //   )
//   //   .all(&db)
//   //   .await
//   //   .unwrap();
//   let users = Company::find()
//     .filter(
//       Condition::all()
//         .add(company::Column::Age.eq(27))
//         .add(company::Column::Name.starts_with("D"))
//         .add(Condition::any().add(company::Column::Salary.eq(85000.0))),
//     )
//     .all(&db)
//     .await
//     .unwrap();
//   axum::Json(users)
// }

#[tracing::instrument(name = "Query users>>>", skip_all)]
#[debug_handler]
async fn query_users(
  State(AppState { db }): State<AppState>,
) -> ApiResultResponse<Vec<company::Model>> {
  let users = Company::find()
    .all(&db)
    .await
    .context("Failed to query users")?;
  Ok(ApiResponse::ok("ok", Some(users)))
}
